package com.wjj.sixinone.handler;

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.wjj.sixinone.common.enums.DeleteEnum;
import com.wjj.sixinone.common.enums.ExceptionEnum;
import com.wjj.sixinone.common.enums.StatusEnum;
import com.wjj.sixinone.common.enums.UserEnum;
import com.wjj.sixinone.common.exception.GlobalException;
import com.wjj.sixinone.common.util.AuthContextUtil;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

@Component
public class FillHandler implements MetaObjectHandler {
    //时间自动填充策略配置



    /**
     * 插入数据时自动填充公共字段。
     * <p>
     * 本方法用于在插入新数据时，自动为数据对象设置一些通用的字段值，这些字段通常包括：
     * 创建时间、更新时间、创建人、更新人、用户角色、删除状态和数据状态。
     * </p>
     * @param metaObject 数据对象，使用反射机制操作对象的属性。
     */
    @Override
    public void insertFill(MetaObject metaObject) {
        // 获取当前操作用户的名字
        String currentUser = null;
        // 尝试从认证上下文中获取当前用户信息
        if (AuthContextUtil.get() != null){
            currentUser = AuthContextUtil.get().getUsername();
        }
        // 设置创建时间和更新时间，使用当前时间
        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        // 设置创建人和更新人为当前操作用户
        this.setFieldValByName("createUser",currentUser,metaObject);
        this.setFieldValByName("updateUser", currentUser,metaObject);
        // 设置用户角色为普通用户
        this.setFieldValByName("userRole", UserEnum.ROLE_USER.getKey(),metaObject);
        // 设置删除状态为未删除
        this.setFieldValByName("deleted", DeleteEnum.NOT_DELETE.getStatus(),metaObject);
        // 设置数据状态为正常
        this.setFieldValByName("status", StatusEnum.NORMAL.getStatus(),metaObject);
    }

    /**
     * 更新实体对象的填充方法。
     * 该方法主要用于在更新数据库记录时，自动为UpdateTime和UpdateUser字段赋值。
     * 它利用了MetaObject来反射地设置对象的属性值，提高了代码的通用性和可维护性。
     *
     * @param metaObject 元对象，代表需要更新的数据实体。
     *                  通过元对象，可以动态地设置实体对象的属性值。
     */
    @Override
    public void updateFill(MetaObject metaObject) {
        // 获取当前登录用户的用户名
        String currentUser = AuthContextUtil.get().getUsername();

        // 检查当前用户是否已登录，如果没有登录则抛出异常
        if (currentUser == null) {
            throw new GlobalException(ExceptionEnum.DATABASE_AUTH_ERROR);
        }

        // 设置UpdateTime字段的值为当前时间
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
        // 设置UpdateUser字段的值为当前登录用户的用户名
        this.setFieldValByName("updateUser", currentUser, metaObject);
    }
}